# app/routes/types.py
from flask import Blueprint, request, jsonify
from app import db
from app.models import OutcomeType
from app.routes.auth import token_required # 导入认证装饰器

bp = Blueprint('types', __name__)

# --- 成果类型 API ---

@bp.route('', methods=['POST'])
@token_required(required_role='admin') # 只有管理员可以创建类型
def create_outcome_type(current_user):
    """创建新的成果类型"""
    data = request.get_json()
    if not data or not data.get('name') or 'schema_definition' not in data:
        return jsonify({"error": "缺少名称或 schema_definition"}), 400

    if OutcomeType.query.filter_by(name=data['name']).first():
        return jsonify({"error": "该类型名称已存在"}), 400

    # 简单验证 schema_definition 是否是字典 (JSON 对象)
    if not isinstance(data.get('schema_definition'), dict):
        return jsonify({"error": "schema_definition 必须是一个 JSON 对象"}), 400

    new_type = OutcomeType(
        name=data['name'],
        schema_definition=data['schema_definition'],
        is_custom=data.get('is_custom', True) # 默认为自定义类型
    )
    db.session.add(new_type)
    db.session.commit()
    return jsonify(new_type.to_dict()), 201

@bp.route('', methods=['GET'])
@token_required # 所有登录用户都可以获取类型列表
def get_outcome_types(current_user):
    """获取所有成果类型列表"""
    types = OutcomeType.query.all()
    return jsonify([t.to_dict() for t in types]), 200

@bp.route('/<int:id>', methods=['GET'])
@token_required # 所有登录用户都可以获取特定类型信息
def get_outcome_type(current_user, id):
    """获取指定 ID 的成果类型"""
    outcome_type = OutcomeType.query.get_or_404(id)
    return jsonify(outcome_type.to_dict()), 200

@bp.route('/<int:id>', methods=['PUT'])
@token_required(required_role='admin') # 只有管理员可以修改类型
def update_outcome_type(current_user, id):
    """修改指定 ID 的成果类型"""
    outcome_type = OutcomeType.query.get_or_404(id)
    data = request.get_json()
    if not data:
        return jsonify({"error": "请求体不能为空"}), 400

    if 'name' in data:
        # 检查新名称是否与除自身外的其他类型冲突
        existing_type = OutcomeType.query.filter(OutcomeType.name == data['name'], OutcomeType.id != id).first()
        if existing_type:
            return jsonify({"error": "该类型名称已被其他类型使用"}), 400
        outcome_type.name = data['name']

    if 'schema_definition' in data:
         # 简单验证
        if not isinstance(data.get('schema_definition'), dict):
            return jsonify({"error": "schema_definition 必须是一个 JSON 对象"}), 400
        outcome_type.schema_definition = data['schema_definition']

    if 'is_custom' in data:
        outcome_type.is_custom = data['is_custom']

    db.session.commit()
    return jsonify(outcome_type.to_dict()), 200

@bp.route('/<int:id>', methods=['DELETE'])
@token_required(required_role='admin') # 只有管理员可以删除类型
def delete_outcome_type(current_user, id):
    """删除指定 ID 的成果类型"""
    outcome_type = OutcomeType.query.get_or_404(id)

    # **重要安全检查**: 检查是否有成果关联到此类型
    if outcome_type.outcomes.first():
        return jsonify({"error": "无法删除，存在关联此类型的成果记录"}), 400
        # 或者可以考虑软删除 (添加 is_deleted 字段) 或将关联成果设为某个默认类型

    db.session.delete(outcome_type)
    db.session.commit()
    return '', 204 # No Content
